package com.k8.rpc.util;

import com.k8.common.config.K8ConfigProperties;
import com.k8.common.constants.CommonKeyConstants;
import com.k8.rpc.url.URL;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @Author: k8
 * @CreateTime: 2025-03-31
 * @Version: 1.0
 */
public class ConfigUtil {
    public static URL mapConfigToConstants(K8ConfigProperties configProperties) {
        URL url = new URL();
        // 处理主接口的常量
        processConstants(CommonKeyConstants.class, configProperties, url);

        // 处理内部嵌套接口的常量
        processConstants(CommonKeyConstants.RpcKeyConstant.class, configProperties, url);
        processConstants(CommonKeyConstants.RegistryKeyConstant.class, configProperties, url);
        return url;
    }

    /**
     * 处理常量接口，将常量与配置类中的属性值对应起来并放入Map
     */
    private static void processConstants(Class<?> constantClass, K8ConfigProperties configProperties, URL url) {
        Field[] fields = constantClass.getDeclaredFields();

        for (Field field : fields) {
            try {
                // 只处理String类型的常量
                if (field.getType() == String.class) {
                    // 获取常量的值（作为Map的key）
                    String constantKey = (String) field.get(null);

                    // 解析属性名（从"k8.config.username"解析出"username"）
                    String propertyName = parsePropertyName(constantKey);

                    // 通过反射调用getter方法获取属性值
                    Object value = getPropertyValue(configProperties, propertyName);

                    if (value != null) {
                        url.setParameter(constantKey,String.valueOf(value));
                    }
                }
            } catch (Exception e) {
                System.err.println("处理常量字段时出错: " + field.getName() + ", 错误: " + e.getMessage());
                throw new RuntimeException(e.getMessage());
            }
        }
    }

    /**
     * 解析属性名，从常量值中提取属性名
     */
    private static String parsePropertyName(String constantValue) {
        String prefix = "k8.config.";
        if (constantValue.startsWith(prefix)) {
            return constantValue.substring(prefix.length());
        }
        return constantValue;
    }

    /**
     * 通过反射获取配置类的属性值
     */
    private static Object getPropertyValue(K8ConfigProperties config, String propertyName)
            throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        // 构建getter方法名（首字母大写）
        String getterMethodName = "get" +
                propertyName.substring(0, 1).toUpperCase() +
                propertyName.substring(1);

        // 对于boolean类型，getter方法可能是isXXX形式
        if (propertyName.startsWith("is")) {
            getterMethodName = propertyName;
        }

        // 特殊处理boolean类型属性的getter方法
        try {
            Method getterMethod = K8ConfigProperties.class.getMethod(getterMethodName);
            return getterMethod.invoke(config);
        } catch (NoSuchMethodException e) {
            // 如果getXXX不存在，尝试isXXX（针对boolean类型）
            if (!getterMethodName.startsWith("is")) {
                getterMethodName = "is" +
                        propertyName.substring(0, 1).toUpperCase() +
                        propertyName.substring(1);
                Method getterMethod = K8ConfigProperties.class.getMethod(getterMethodName);
                return getterMethod.invoke(config);
            }
            throw e;
        }
    }
}
